package cl.tinet.trainee.ejb;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.Stateful;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import cl.tinet.trainee.dao.ProductosDAO;
import cl.tinet.trainee.dao.ProductosDAOImpl;
import cl.tinet.trainee.model.CarroTO;
import cl.tinet.trainee.model.DatosMostrarTO;
import cl.tinet.trainee.model.DetalleCarroTO;
import cl.tinet.trainee.model.ProductoTO;
import cl.tinet.trainee.model.UsuarioTO;

/**
 * Session Bean implementation class CarroBean
 */
@Stateless
public class CarroBean implements CarroBeanLocal {

	private ProductosDAO productosDAO;
	private CarroTO carroTO;
	private DetalleCarroTO detalleCarroTO;	
	private DatosMostrarTO datosMostrarTO;
	
	@PersistenceContext(unitName="conexionCarroCompra")
	private EntityManager em;
		
	@PostConstruct
	public void init(){
		
		productosDAO = new ProductosDAOImpl(em); 
		carroTO = new CarroTO();
		carroTO.setCompraFinalizada(0);
		carroTO.setNombreUsuario("invitado");
			productosDAO.crearCarro(carroTO);
	}

	 /** 
     * {@inheritDoc}
     */
    public List<ProductoTO> listarProductos(){
	  
	  productosDAO = new ProductosDAOImpl(em); 
	  return productosDAO.listarProductos();	  
    }
   
    /** 
     * {@inheritDoc}
     */
    public DatosMostrarTO agregarProducto(ProductoTO productoTO){
    	
    	productosDAO = new ProductosDAOImpl(em);
    	carroTO = new CarroTO();
    	carroTO = cargarCarro();
    	
    	detalleCarroTO = new DetalleCarroTO();    
    	    detalleCarroTO.setIdCarro(carroTO);
    	    detalleCarroTO.setIdProducto(productoTO);    		
    		detalleCarroTO.setCantidad(DetalleCarroTO.CANTIDAD_INICIAL);
    		    		
		List<DetalleCarroTO> lDetalleCarroTO = new ArrayList<DetalleCarroTO>(); 
			lDetalleCarroTO.addAll(carroTO.getlDetalleCarro());
			lDetalleCarroTO.add(detalleCarroTO);
    	
    	productosDAO.agregarProducto(detalleCarroTO);
    	//descontarStock(productoTO);
    	listarProductos();
    	    
    	return calcularDatosParaMostrar(lDetalleCarroTO);
    }
    
    /**
     * {@inheritDoc}
     */
    public DatosMostrarTO calcularDatosParaMostrar(List<DetalleCarroTO> lDetalleCarroTO){
    	
    	datosMostrarTO = new DatosMostrarTO();		
    	for (DetalleCarroTO detalleCarroTO : lDetalleCarroTO) {
    		datosMostrarTO.setCantidadProductos(datosMostrarTO.getCantidadProductos() + detalleCarroTO.getCantidad());
    		datosMostrarTO.setTotalCompra(datosMostrarTO.getTotalCompra() + detalleCarroTO.getIdProducto().getPrecio());
    	}		
    	return datosMostrarTO;
    }
   
    /**
     * {@inheritDoc}
     * @return
     */
	public CarroTO cargarCarro() {
		productosDAO = new ProductosDAOImpl(em);
		CarroTO c = productosDAO.cargarCarro();
		c.getlDetalleCarro().size();
		return c;
	}
	
    /**
     * {@inheritDoc}
     */
	public void descontarStock(ProductoTO productoTO) {	
		  productosDAO = new ProductosDAOImpl(em); 
		  productoTO.setStock(productoTO.getStock()-1);		  
		  productosDAO.descontarStock(productoTO);
	}

	
	/**
	 * {@inheritDoc}
	 */
	public void agregarCantidad(DetalleCarroTO detalleCarroTO){			
		  detalleCarroTO.setCantidad(detalleCarroTO.getCantidad() + 1);
		  actualizarDetalle(detalleCarroTO);			
	}
	
	/**
	 * {@inheritDoc}
	 */
	public CarroTO restarCantidad(DetalleCarroTO detalleCarroTO){
		
		  detalleCarroTO.setCantidad(detalleCarroTO.getCantidad() - 1);
		  actualizarDetalle(detalleCarroTO);
		
		return cargarCarro();
	}
		

	/**
	 * Metodo encargado de eliminar un detalle de carro
	 */
	public void eliminarDetalle(DetalleCarroTO detalleCarroTO){
		 productosDAO = new ProductosDAOImpl(em); 		  
		 productosDAO.eliminarDetalle(detalleCarroTO);		
	}
	
	
	/**
	 * {@inheritDoc}
	 */
	public void actualizarDetalle(DetalleCarroTO detalleCarroTO){
		 productosDAO = new ProductosDAOImpl(em); 		  
		 productosDAO.actualizarDetalle(detalleCarroTO);
		
	}
	/**
	 * {@inheritDoc}
	 */
	public UsuarioTO identificarUsuario(UsuarioTO usuarioTO){				  
			productosDAO = new ProductosDAOImpl(em);					
			return productosDAO.identificarUsuario(usuarioTO);
				
	}

	/**
	 * {@inheritDoc}
	 */
	public CarroTO editarCarro(CarroTO carroTO){
		
		
		
		return carroTO;
	}
    
	/**
	 * @return the carroTO
	 */
	public CarroTO getCarroTO() {
		return carroTO;
	}

	/**
	 * @param carroTO the carroTO to set
	 */
	public void setCarroTO(CarroTO carroTO) {
		this.carroTO = carroTO;
	}

	/**
	 * @return the productosDAO
	 */
	public ProductosDAO getProductosDAO() {
		return productosDAO;
	}

	/**
	 * @param productosDAO the productosDAO to set
	 */
	public void setProductosDAO(ProductosDAO productosDAO) {
		this.productosDAO = productosDAO;
	}

	/**
	 * @return the detalleCarroTO
	 */
	public DetalleCarroTO getDetalleCarroTO() {
		return detalleCarroTO;
	}

	/**
	 * @param detalleCarroTO the detalleCarroTO to set
	 */
	public void setDetalleCarroTO(DetalleCarroTO detalleCarroTO) {
		this.detalleCarroTO = detalleCarroTO;
	}

	/**
	 * @return the em
	 */
	public EntityManager getEm() {
		return em;
	}

	/**
	 * @param em the em to set
	 */
	public void setEm(EntityManager em) {
		this.em = em;
	}

	/**
	 * @return the datosMostrarTO
	 */
	public DatosMostrarTO getDatosMostrarTO() {
		return datosMostrarTO;
	}

	/**
	 * @param datosMostrarTO the datosMostrarTO to set
	 */
	public void setDatosMostrarTO(DatosMostrarTO datosMostrarTO) {
		this.datosMostrarTO = datosMostrarTO;
	}


    
}
